package org.whl.util.spark

import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession

import java.util.Properties

/**
 * @author 王浩霖
 * @version 1.0.0 2024/12/25 17:55
 */
object SparkUtil {
  def apply(): SparkSession = {//这里定义了一个 apply 方法，它返回一个 SparkSession 实例。当我们调用 SparkUtil() 时，实际上会执行这个方法
    System.setProperty("HADOOP_USER_NAME", "root")//这行代码设置了Hadoop的用户名称为“root”。这意味着后续的Hadoop作业将以“root”用户的身份执行
    // System.setProperty("HADOOP_USER_NAME", "lhz")
    val sparkConf = new SparkConf()//创建一个新的 SparkConf 对象。SparkConf 是用于配置Spark应用程序的类
    if (!sparkConf.contains("spark.master")) {
      sparkConf.setMaster("local")//设置Spark的运行模式为“local”，意味着作业将仅在本地运行，而不是在集群上
    }
    val prop = new Properties()//创建一个新的 Properties 对象，用于读取配置属性
    prop.load(this.getClass.getClassLoader.getResourceAsStream("hive.properties"))
    val sparkSession: SparkSession = SparkSession
      .builder()//调用 SparkSession 的构建器方法，开始构建 SparkSession 实例
      .appName("Spark SQL JDBC")//设置Spark应用程序的名称为 "Spark SQL JDBC"
      .config(conf = sparkConf)//将之前创建的 sparkConf 配置传递给 SparkSession 的构建器
      //      .config("spark.sql.warehouse.dir", prop.getProperty("warehouse.dir"))
      //      .config("hive.metastore.uris", prop.getProperty("metastore.uris"))
      .enableHiveSupport()//启用 Hive 支持，使 SparkSession 可以访问 Hive Metastore
      .getOrCreate()//获取现有的 SparkSession 实例，如果不存在则创建一个新的实例
    sparkSession//返回 SparkSession 实例
  }

  /**
   * 获取 mysql 连接参数
   *
   * @param tableName 数据表名称 默认数据库名称为 lihaozhe
   * @return
   */
  def mysqlConnectionProperties(tableName: String): Properties = {
    val prop = new Properties()
    prop.load(this.getClass.getClassLoader.getResourceAsStream("mysql.properties"))
    val schema = prop.remove("schema")
    prop.put("tableName", schema + "." + tableName)
    prop
  }

  /**
   * 获取 mysql 连接参数
   *
   * @param schema    数据库名称
   * @param tableName 数据表名称
   * @return
   */
  def mysqlConnectionProperties(schema: String, tableName: String): Properties = {
    val prop = new Properties()
    prop.load(this.getClass.getClassLoader.getResourceAsStream("mysql.properties"))
    prop.remove("schema")
    prop.put("tableName", schema + "." + tableName)
    prop
  }

  /**
   * 百分比转换
   *
   * @param number 浮点数
   * @return 百分比
   */
  def rate(number: Double): Double = {
    BigDecimal(number).setScale(4, BigDecimal.RoundingMode.HALF_UP).toDouble * 100
  }
}
